//=============================================================================
///	Eval
//=============================================================================

#ifndef	__SEVAL_H__
#define	__SEVAL_H__

#include "sexp.h"

#ifdef __cplusplus
extern "C" {
#endif

SExp eval(SExp s);
SExp apply(SExp fn, SExp args, int not_evaled);

SExp compile(SExp s);
SExp run(SExp s);

SExp macroexpand_1(SExp self, SExp s);
SExp macroexpand(SExp self, SExp s);


void push_stack(SExp s);
SExp pop_stack(int n);
SExp ref_stack(int ofs);
int evlis(SExp** pframe, SExp ls, int b_eval);


void cons_on_stack(void);
void cons_on_stack_rev(void);
SExp pop_nrev_stack(void);

void mark_stack(void);

#ifdef __cplusplus
} // extern "C"
#endif

#endif
